package com.study.algorithm.binarytree;

import java.util.LinkedList;
import java.util.Queue;

/**
 * 226.翻转二叉树
 */
public class InvertTree {
    //方法一：递归，深度优先
    public TreeNode invertTree(TreeNode root) {
        // 递归终止条件：空树不需要翻转
        if (root == null) {
            return null;
        }

        // 1. 递归翻转左子树
        TreeNode left = invertTree(root.left);

        // 2. 递归翻转右子树
        TreeNode right = invertTree(root.right);

        // 3. 交换左右子树
        root.left = right;
        root.right = left;

        // 返回翻转后的根节点
        return root;
    }
    //方法二：迭代，广度优先
    public TreeNode invertTree1(TreeNode root) {
        // 处理空树情况
        if (root == null) {
            return null;
        }

        // 创建队列用于BFS遍历
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root); // 将根节点加入队列

        // 当队列不为空时，继续处理
        while (!queue.isEmpty()) {
            TreeNode currentNode = queue.poll(); // 取出队首节点

            // 交换当前节点的左右子树
            TreeNode temp = currentNode.left;
            currentNode.left = currentNode.right;
            currentNode.right = temp;

            // 将非空子节点加入队列，继续处理
            if (currentNode.left != null) {
                queue.offer(currentNode.left);
            }
            if (currentNode.right != null) {
                queue.offer(currentNode.right);
            }
        }

        return root; // 返回翻转后的根节点
    }
}
